import { post } from "./post";
export const submitUpload = (file) => {
    return new Promise((res, rej) => {
            // 切割文件 
            let chunkSize = 2 * 1024 * 1024 // 限制单个最大为2M
            let result = null; //结果
            // 拿到文件 
            // let file = file // 这里展示的是一个图片的上传，如果需要多个图片只需要将这个做一个forEach循环就OK了
            //  打标记， 时间戳
            let token = (+ new Date())// 用时间戳来作为传数的唯一标识号
            let name = file.name// 获取文件的名字
            let chunkCount = 0// 传文件时，作为一个累加的数
            let sendChunkCount = 0// 对于传出的文件，作为一个计数
            let chunks = []// 将大于2M的文件分割成为一个数组
            // 拆文件
            if (file.size > chunkSize) {
                let start = 0, end = 0;
                while (true) {
                    end += chunkSize
                    let blob = file.slice(start, end)// 将file切割成单个为2M的数据流
                    start += chunkSize
                    if (!blob.size) { //  截不到东西
                        break;
                    }
                    chunks.push(blob) // 保存片段
                }
            } else {
                chunks.push(file.slice(0))// 文件小于2M直接一次性传给后端
            };
            chunkCount = chunks.length; // 获取数组的长度，依次向后端发起请求
            for (let i = 0; i < chunkCount; i++) {
                let fd = new FormData();//new一个formData
                fd.append('token', token)//时间戳 作为唯一标记
                fd.append('f1', chunks[i])//片段
                fd.append('index', i)// 数量
                // 拿到了每次需要的,此时只需要朝后端发起请求就OK了
                new Promise((resolve, reject) => {
                    AxiosPost(fd, () => {
                        sendChunkCount += 1
                        if (sendChunkCount === chunkCount) {
                            let formD = new FormData()
                            formD.append('type', 'merge')
                            formD.append('token', token)
                            formD.append('chunkCount', chunkCount)
                            formD.append('filename', name)
                            AxiosPost(formD, undefined).then((data) => resolve(data)).catch(err => reject(err))
                        }
                    })
        
                }).then(data => res(data)).catch((error) => {
                    console.log(error);
                    return Error(error)
                })
            }
    })
}
// 每次传完之后都会进行一次判断, 如果没有传完则会继续调用AxiosPost() 如果传完了则会发送合并请求
const AxiosPost = async (fd, callback) => {
    let result = await post('/user/uploadImg', fd).then(res => {
        if (res.code === 202) {
            callback && callback()
            return res
        } else if (res.code === 200) {
            return res
        } else {
            throw new Error('错误')
        }
    })
    return result
}